package lbok;

import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.function.Consumer;

/**
 * lombok测试
 * @author ben
 * @date 2021-11-18 20:51:14 CST
 */
public final class LombokTest {

	private static Consumer<Object> cs = System.out::println;
	
	public static void main(String[] args) {
//		test1();
		
		test2();
	}
	
	/**
	 * @Data 和 @Builder 分别建立了什么函数
	 * @author ben
	 * @date 2021-11-19 20:55:36 CST
	 */
	public static void test1() {
		// 使用 @Data 的类
		Class<?> pc = Paper.class;
		
		Annotation[] aarr = pc.getAnnotations();
		cs.accept("Paper.class 注解数量：" + aarr.length); // 0! 编译阶段已经处理了吧
		
		
		Method[] marr = pc.getMethods();
		cs.accept("Paper.class 方法数量：" + marr.length);
		Arrays.asList(marr).forEach(md->{
			cs.accept("md=" + md + ", " + md.getName() + ", " + md.getParameterCount());
		});
		
		// 使用 @Builder 的类
		Class<?> ac = Author.class;
		
		aarr = pc.getAnnotations();
		cs.accept("Author.class 注解数量：" + aarr.length); // 0! 编译阶段已经处理了吧
		
		marr = ac.getMethods();
		cs.accept("Author.class 方法数量：" + marr.length);
		Arrays.asList(marr).forEach(md->{
			cs.accept("md=" + md + ", " + md.getName() + ", " + md.getParameterCount());
		});
		
	}

	/**
	 * 继承父类
	 * EqualsAndHashCode注解的 callSuper 设置为 true时效果不同——更符合预期
	 * @author ben
	 * @date 2021-11-19 20:56:14 CST
	 */
	public static void test2() {
		// try 1
		Child child1 = new Child();
		child1.setAge(1);
		child1.setName("child");
		child1.setType("ptype");

		Child child2 = new Child();
		child2.setAge(1);
		child2.setName("child");
		
		System.out.println("child1=" + child1);
		System.out.println("child2=" + child2);
		System.out.println(child1 == child2);
		System.out.println(child1.equals(child2)); // true 期待是 false
		
		System.out.println("child1.hashCode()=" + child1.hashCode()); // 相同
		System.out.println("child2.hashCode()=" + child2.hashCode());
		
		// try 2
		Map<Child, Integer> mapt = new HashMap<>();
		mapt.put(child1, 1);
		mapt.put(child2, 2);
		// 结果1：{Child(name=child, age=1)=2}
		// 结果2：{Child(name=child, age=1)=2, Child(name=child, age=1)=1}
		cs.accept(mapt);
		
	}

}
